package websocket

import (
	"errors"
	"fmt"
	"github.com/garyburd/redigo/redis"
	"golang.org/x/net/websocket"
	"im/config"
	"im/im-server/app/data"
	"im/im-server/app/websocket/connection"
	"im/im-server/util"
	ser "im/server/websocket"
	"net/http"
)

var (
	key    = config.Cfg.Keys.Jwt
	redisc redis.Conn
)

func init() {
	var err error
	redisc, err = redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("====>>> redis ==>", err)
	}
}

// OnHandSheKe todo 自定义握手协议的方法，接收 im-client传给 im-server的消息的验证，通过token，token为jwt生成的数据，是在im-client请求im-cloud时，在im-cloud中生成的token, 客服端每次先进入这个握手的方法，这个方法通过之后，在继续后面的方法
func OnHandSheKe(config *websocket.Config, r *http.Request) error {
	token := r.Header.Get("Sec-WebSocket-Protocol") // 固定的写法，在浏览器中 ws接口里面 request的header里面
	if token == "" {
		return errors.New("toke(Sec-WebSocket-Protocol) 不存在")
	}

	// 对token的校验
	if _, err := util.AuthCheck(token, key); err != nil {
		return err
	}

	fmt.Println(token)
	return nil
}

// 启动方法
func OnOpen(server *ser.Server, conn *websocket.Conn) {
	fmt.Println("连接成功，启动im-cloud的Websocket")
	// 通过token获取解析获取数据，将数据存储到结构体中和redis
	info, _ := util.AuthCheck(conn.Request().Header.Get("Sec-WebSocket-Protocol"), key)
	connection.Connections[info["uid"]] = &connection.Connection{
		Uid:      info["uid"],
		Conn:     conn,
		UserInfo: info,
	}

	redisc.Do("hset", key, info["uid"], info["seruri"])

	ser.SendJson(conn, &data.Reply{
		Code: 200,
		Msg:  "欢迎：" + info["name"] + "加入聊天",
	})
}

// 接收数据后，要处理的逻辑
func OnMessage(server *ser.Server, frame *ser.Frame) {
	fmt.Println(frame.Data)
	ser.SendJson(server.Conn(), &data.Reply{
		Code: 200,
		Msg:  "欢迎：加入聊天",
	})
}

// 关闭链接时，调用的方法
func OnClose(server *ser.Server, conn *websocket.Conn) {
	info, _ := util.AuthCheck(conn.Request().Header.Get("Sec-WebSocket-Protocol"), key)
	delete(connection.Connections, info["uid"])

	redisc.Do("hdel", key, info["uid"])
	fmt.Println(info["name"] + "连接断开")
}
